home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
bmgrep.arc
/
EXECUTE.C
< prev
next >
Wrap
Text File
|
1986-12-09
|
3KB
|
90 lines
#include <stdio.h>
#include "bm.h"
#include "extern.h"
Execute(DescVec, NPats, TextFile, Buffer)
register struct PattDesc *DescVec[];
/* pointers to status vectors for the different
* patterns, including skip tables, position in buffer, etc. */
register int NPats; /* number of patterns */
register char Buffer[]; /* holds text from file */
register int TextFile; /* file to search */
{
int NRead, /* number of chars read from file */
NWanted, /* number of chars wanted */
NAvail, /* number of chars actually read */
BuffSize, /* number of chars in buffer */
BuffPos, /* offset of first char in Buffer in TextFile */
BuffEx, /* flag to indicate that buffer has been searched */
ResSize,
/* number of characters in the last, incomplete line */
Found, /* flag indicates whether pattern found
* completely and all matches printed */
Valid; /* was the match "valid", i.e. if -x used,
* did the whole line match? */
char *BuffEnd; /* pointer to last char of last complete line */
/* misc working variables */
int i;
/* initialize */
ResSize = 0;
Found = 0;
BuffPos = 0;
for (i=0; i < NPats; i++) {
DescVec[i] -> Success = 0;
DescVec[i] -> Start = Buffer;
} /* for */
/* now do the searching */
do {
/* first, read a bufferfull and set up the variables */
NWanted = MAXBUFF - ResSize; NRead = 0;
do {
NAvail =
read(TextFile,Buffer + ResSize + NRead, NWanted);
if (NAvail == -1) {
fprintf(stderr,
"bm: error reading from input file\n");
exit(2);
} /* if */
NRead += NAvail; NWanted -= NAvail;
} while (NAvail && NWanted);
BuffEx = 0;
BuffSize = ResSize + NRead;
BuffEnd = Buffer + BuffSize - 1;
/* locate the end of the last complete line */
while (*BuffEnd != '\n' && BuffEnd >= Buffer)
--BuffEnd;
if (BuffEnd < Buffer)
BuffEnd = Buffer + BuffSize - 1;
while (!BuffEx) { /* work through one buffer full */
BuffEx = 1; /* set it provisionally, then clear
* it if we find the buffer non-empty */
for (i=0; i< NPats; i++) {
if (!DescVec[i]->Success)
/* if the pattern has not been found */
DescVec[i]-> Success =
Search(DescVec[i]->Pattern,
DescVec[i]->PatLen, BuffEnd,
DescVec[i]->Skip1, DescVec[i]->Skip2,
DescVec[i]);
if (DescVec[i]->Success){
/* if a match occurred */
BuffEx = 0;
Valid = MatchFound(DescVec[i],BuffPos,
Buffer, BuffEnd);
Found |= Valid;
if ((sFlag || lFlag) && Found)
return(0);
} /* if */
} /* for */
} /* while */
if(NRead) {
ResSize = MoveResidue(DescVec,NPats,Buffer,
Buffer+BuffSize-1);
BuffPos += BuffSize - ResSize;
} /* if */
} while (NRead);
return(!Found);
} /* Execute */